#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/gpio.h"
#include "sdkconfig.h"
#include "freertos/event_groups.h"

#define LED_GPIO GPIO_NUM_27
// 定义一个宏（全局变量Java）
#define TAG "LEDC"
// LED 闪烁运行任务
void led_run_task(void *param){
    int gpio_level = 0;
    while(1){
        // 延时 500 ms
        vTaskDelay(pdMS_TO_TICKS(500));
        gpio_set_level(LED_GPIO, gpio_level);
        // 反转值（开关状态）
        gpio_level = gpio_level? 0:1;
    }
}

// LED 闪烁初始化
void led_flash_init(void)
{
    gpio_config_t led_gpio_cfg ={
        .pin_bit_mask = (1 << LED_GPIO),        // 指定 GPIO
        .mode = GPIO_MODE_OUTPUT,               // 设置为输出模式
        .pull_up_en = GPIO_PULLUP_DISABLE,      // 禁止下拉
        .pull_down_en = GPIO_PULLDOWN_DISABLE,  // 禁止下拉
        .intr_type = GPIO_INTR_DISABLE,         // 禁止中断
    };
    gpio_config(&led_gpio_cfg);
    xTaskCreatePinnedToCore(led_run_task, "led", 2048, NULL, 3, NULL, 1);
}

#define LEDC_TIMER  LEDC_TIMER_0  // 定时器 0
#define LEDC_MODE   LEDC_LOW_SPEED_MODE  // 低速模式
#define LEDC_OUTPUT_IO  (LED_GPIO)  // 选择 GPIO 端口
#define LEDC_CHANNEL  LEDC_CHANNEL_0  // PWM 通道
#define LEDC_DUTY_RES LEDC_TIMER_13_BIT  // 分辨率
#define LEDC_DUTY     (4095)   // 最大占空比 这里是 2^13-1
#define LEDC_FREQUENCY  (5000)  // PWM 周期

// 用于通知渐变完成
static EventGroupHandle_t s_ledc_ev = NULL;

// 关灯完成事件标志
#define LEDC_OFF_EV (1<<0)
// 开灯完成事件标志
#define LEDC_ON_EV (1<<1)

// 渐变完成回调函数
bool IRAM_ATTR ledc_finish_cb(const ledc_cb_param_t *param, void *user_arg){
    BaseType_t xHigherPriorityTaskWoken;
    if (param->duty)
    {
       xEventGroupSetBitsFromISR(s_ledc_ev,LEDC_ON_EV,&xHigherPriorityTaskWoken);
    }else{
       xEventGroupSetBitsFromISR(s_ledc_ev,LEDC_OFF_EV,&xHigherPriorityTaskWoken);
    }
    return xHigherPriorityTaskWoken;
}

// ledc 渐变任务 todo
void app_main(void)
{
    // 配置 gpio
    gpio_config_t led_cfg = {
        .pin_bit_mask = (1<<LED_GPIO),
        .pull_up_en = GPIO_PULLUP_DISABLE,
        .pull_down_en = GPIO_PULLDOWN_DISABLE,
        .mode = GPIO_MODE_OUTPUT,
        .intr_type = GPIO_INTR_DISABLE,
    };

    // 配置 gpio 引脚
    gpio_config(&led_cfg);
    
    // 创建任务
    xTaskCreatePinnedToCore(led_run_task, "led",2048,NULL,3,NULL,1);
}
